<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        function Person(name,age){
            this.name = name;
            this.age  = age;

            return {}

        }
        Person.prototype.eat=function(){
            console.log('吃饭');
        }

        // 手写new函数(传入构造函数，第二个用...rest参数接收多个值)
        function myNew(constr,...arg){
            //1、创建一个空对象
            const obj = {};
            //2、修改this指向，把构造函数的this指向我们创建的对象 (函数调用call后有个返回值)
           const re =  constr.apply(obj,arg)
        //    console.log(re);
            // 3、把obj的隐式原型指向构造函数的显示原型对象
            obj.__proto__ = constr.prototype
            //返回值 //如果构造函数返回基本数据类型，则返回新对象。  
                    // 如果返回引用数据类型，则返回这个引用数据类型
            if(typeof re === 'object' && re !== null || typeof re ==='function'){
                return re
            }else{
                return obj
            }
        }

        const p1 = myNew(Person,'laowang',20)

        console.log('p1',p1);

    </script>
</body>
</html>